package capaServicios;

import implementacion.Comentario;
import implementacion.Comentarios;
import implementacion.InfoRuta;
import implementacion.InfoRutas;
import implementacion.Ruta;
import implementacion.Rutas;
import implementacion.Usuario;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import capaPresentacion.shared.ComentarioDTO;
import capaPresentacion.shared.InfoRutaDTO;
import capaPresentacion.shared.RutaDTO;
import capaPresentacion.shared.RutaFicheroDTO;
import capaPresentacion.shared.UsuarioDTO;
import clasesAuxiliares.RutaFichero;

public class ServicioRuta {

	private EntityManagerFactory emf;
	private EntityManager em;

	public ServicioRuta() {
		emf = Persistence.createEntityManagerFactory("worldstrainer");
		em = emf.createEntityManager();
	}

	public void anyadirRuta(RutaDTO rutaDTO, InfoRutaDTO infoRutaDTO) {
		Rutas rutas = new Rutas(em);
		InfoRutas infoRutas = new InfoRutas(em);
		UsuarioDTO usuarioDTO = infoRutaDTO.getUsuario();
		Usuario usuario = em.find(Usuario.class, usuarioDTO.getEmail());
		Ruta ruta = new Ruta(rutaDTO.getNombre(), rutaDTO.getNombreFichero(),
				rutaDTO.getDistancia(), rutaDTO.getTipo());
		InfoRuta infoRuta = new InfoRuta(infoRutaDTO.getDuracion(),
				infoRutaDTO.getVelocidadMedia(),
				infoRutaDTO.getVelocidadMaxima(), infoRutaDTO.getCalorias(),
				usuario, ruta);
		em.getTransaction().begin();
		rutas.anyadirRuta(ruta);
		infoRutas.anyadirInfoRuta(infoRuta);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}

	public void eliminarInfo(long idInfoRuta) {
		InfoRutas infoRutas = new InfoRutas(em);
		em.getTransaction().begin();
		infoRutas.eliminarInfoRuta(idInfoRuta);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}

	public List<RutaDTO> buscarRuta(String cadena) {
		Rutas rutas = new Rutas(em);
		em.getTransaction().begin();
		List<Ruta> rutasAux = rutas.buscarRutas(cadena);
		List<RutaDTO> rutasDTO = new ArrayList<RutaDTO>();
		for (Ruta ruta : rutasAux)
			rutasDTO.add(ruta.rutaDTO());
		em.getTransaction().commit();
		em.close();
		emf.close();
		return rutasDTO;
	}

	public List<InfoRutaDTO> obtenerMisInfoRutas(String emailUsuario) {
		InfoRutas infoRutas = new InfoRutas(em);
		em.getTransaction().begin();
		List<InfoRuta> infoRutasAux = infoRutas.verMisInfoRutas(emailUsuario);
		List<InfoRutaDTO> infoRutasDTO = new ArrayList<InfoRutaDTO>();
		for (InfoRuta InfoRuta : infoRutasAux)
			infoRutasDTO.add(InfoRuta.infoRutaDTO());
		em.getTransaction().commit();
		em.close();
		emf.close();
		return infoRutasDTO;
	}

	public RutaFicheroDTO obtenerInfoRutaConFichero(long idInfo) {
		InfoRutas infoRutas = new InfoRutas(em);
		em.getTransaction().begin();
		RutaFichero infoRuta = infoRutas
				.verInfoConFichero(idInfo);
		em.getTransaction().commit();
		em.close();
		emf.close();
		return infoRuta.rutaFicheroDTO();
	}

	public List<ComentarioDTO> obtenerComentariosRuta(long idRuta) {
		Comentarios comentarios = new Comentarios(em);
		em.getTransaction().begin();
		List<Comentario> comentariosAux = comentarios
				.recuperarComentarios(idRuta);
		List<ComentarioDTO> comentariosDTO = new ArrayList<ComentarioDTO>();
		for (Comentario comentario : comentariosAux) {
			comentariosDTO.add(comentario.comentarioDTO());
		}
		em.getTransaction().commit();
		em.close();
		emf.close();
		return comentariosDTO;
	}

	public void borrarRuta(Long idRuta) {
		Rutas rutas = new Rutas(em);
		em.getTransaction().begin();
		rutas.eliminarRuta(idRuta);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}

	public RutaFicheroDTO obtenerDatosRutaConFichero(long idRuta) {
		Rutas rutas = new Rutas(em);
		em.getTransaction().begin();
		RutaFichero ruta = rutas.obtenerDatosRutaConFichero(idRuta);
		em.getTransaction().commit();
		em.close();
		emf.close();
		return ruta.rutaFicheroDTO();
	}
}
